import java.util.Arrays;
import java.util.List;

public class Client {
    public static void main(String[] args) {
        // 初始化论文列表
        List<Paper> papers = Arrays.asList(
            new Thesis("基于机器学习的软件缺陷预测方法研究"),
            new ConferencePaper("云计算环境下的软件架构优化"),
            new JournalPaper("软件测试自动化技术综述"),
            new JournalPaper("人工智能在软件开发中的应用")
        );

        // 创建论文列表管理对象
        PaperList paperList = new PaperList("张教授", papers);

        // 创建学生列表
        List<Student> students = Arrays.asList(
            new Student("张三", 1, PaperType.Thesis),
            new Student("李四", 2, PaperType.JournalPaper),
            new Student("王五", 1, PaperType.ConferencePaper)
        );

        // 学生选择论文
        for (Student student : students) {
            try {
                // 使用随机策略选择论文
                List<Paper> selectedPapers = paperList.selectPaperByRandom(student);
                System.out.println(student.getName() + " 成功选择了 " + selectedPapers.size() + " 篇论文：");
                for (Paper paper : selectedPapers) {
                    System.out.println("  - " + paper.getTitle());
                }
            } catch (NoEnoughPapersException e) {
                System.err.println(e.getMessage());
            }
        }

        // 使用Visitor模式统计选择结果
        System.out.println("\n==== 统计信息 ====");
        
        // 统计选择论文的学生数量
        Visitor studentCountVisitor = new StudentCountVisitor();
        paperList.getSelectionResult().accept(studentCountVisitor);
        System.out.println("共有 " + studentCountVisitor.getResult() + " 位学生选择了论文");
        
        // 统计不同类型论文的选择数量
        Visitor typeCounter = new PaperTypeCounter();
        paperList.getSelectionResult().accept(typeCounter);
        System.out.println("论文类型分布：" + typeCounter.getResult());
        
        // 计算平均每位学生选择的论文数量
        Visitor avgCounter = new AveragePaperPerStudent();
        paperList.getSelectionResult().accept(avgCounter);
        System.out.printf("平均每位学生选择 %.2f 篇论文%n", avgCounter.getResult());
    }
}    